// Package controller 控制器的函数 包含gin的句柄
// 公共函数和常量部分
package controller

import (
	"log"
	"net/http"

	"ginbase/switcher/comm"
	"ginbase/zConfig"

	"github.com/gin-gonic/gin"
	"github.com/xormplus/xorm"
)

// 常量
const (
    // 禁用JWT
    JWTDeactived = "0"
)

// 数据库连接配置
const (
    // sqlite3
    sqlite3SourcePattern = `file:%s?cache=shared&_journal_mode=wal`
    // mysql
    mysqlSourcePattern = `%s:%s@%s/%s`
    // oracle
    oracleSourcePattern = `%s:%s@%s/%s`
    // postgresql
    postgresqlSourcePattern = `host=%s port=%d user=%s password=%s dbname=%s sslmode=disable`
    // sql server
    sqlserverSourcePattern = `server=%s;port%d;database=%s;user id=%s;password=%s`
)

// 返回请求的数据
func dataResponse(c *gin.Context, rtn *Rtn) {
    _, exists := c.GetQuery("callback")
    var status int
    // 判断请求成功失败
    if rtn.Success {
        // 请求成功返回200状态
        status = http.StatusOK
    } else {
        // 请求失败返回500状态
        status = http.StatusInternalServerError
    }
    // 有callback参数时 采用jsonp返回数据
    if exists {
        c.JSONP(status, rtn)
    } else {
        // 没有callback参数时 采用json返回数据
        c.JSON(status, rtn)
    }
}

// Authorize 鉴权参数
func Authorize(c *gin.Context) bool {
    token := comm.GetParamWithPanic(c, "token")
    return token == "Jh2044695"
}

// 异常情况的处理函数
func (ctrl *CTRLXorm)PanicHanlder(c *gin.Context, engines []*xorm.Engine) {
    ctrl.panicHanlder(c, engines)
}
func (ctrl *CTRLXorm)panicHanlder(c *gin.Context, engines []*xorm.Engine) {
    // 关闭数据库
    CloseEngine(engines...)
    // 获取异常信息
    err := recover()
    log.Printf("panic info:%v", err)
    if nil != err {
        errMsg, ok := err.(string)
        if !ok {
            errMsg = "请求失败"
        }
        if nil != c {
            // 返回异常数据 结束请求
            dataResponse(c, &Rtn{false, errMsg, nil})
        }
    }
}

// 异常情况的处理函数
func (ctrl *CTRLXorm)PanicHanlderII(c *gin.Context, engine *xorm.Engine) {
    ctrl.panicHanlderII(c, engine)
}
func (ctrl *CTRLXorm)panicHanlderII(c *gin.Context, engine *xorm.Engine) {
    // 关闭数据库
    CloseEngine(engine)
    // 获取异常信息
    err := recover()
    log.Printf("panic info:%v", err)
    if nil != err {
        errMsg, ok := err.(string)
        if !ok {
            errMsg = "请求失败"
        }
        if nil != c {
            // 返回异常数据 结束请求
            dataResponse(c, &Rtn{false, errMsg, nil})
        }
    }
}

// main函数中出错  打印错误信息并退出
func dealError(err error, msg string) {
    if nil != err {
        log.Println(msg)
        log.Fatal(err)
    }
}

// 新建CTRLXorm结构体
func NewCTRLXorm(cfg *zConfig.ServiceConfig, consts map[string]string) *CTRLXorm {
    return &CTRLXorm {
        Cfg: cfg,
        Consts: consts,
    }
}